/************************************************************************
 * <br>
 * <ul>
 * <li>版权所有：唐山弘川科技有限公司 2009－2020</li>
 * <li>创建日期：2009-8-10</li>
 * <li>初始作者：刘川</li>
 * </ul>
 * <ul>
 * <b>修订历史</b>
 * <li>1、</li>
 * </ul>
 ***********************************************************************/
package com.hy.enterprise.framework.persistence.domain.query ;

import java.util.Collection ;

import com.hy.enterprise.framework.persistence.domain.query.internal.AliasFactory;
import com.hy.enterprise.framework.persistence.domain.query.internal.managedobjects.LibraManagedObject;

/**
 * <ul>
 * <li>设计作者：刘川</li>
 * <li>设计日期：2009-8-10</li>
 * <li>设计时间：下午04:15:51</li>
 * <li>设计目的：</li>
 * </ul>
 * <ul>
 * <b>修订历史</b>
 * <li>1、</li>
 * </ul>
 */
public class SelectClause < S > extends AbstractClause
{
	private final Object [ ]	selectedElements ;

	/**
	 * 构造函数
	 * 
	 * @param selectedElements
	 */
	public SelectClause (
	                      Object [ ] selectedElements )
	{
		super (
		        null ) ;
		this.selectedElements =
		                        selectedElements ;
	}

	/**
	 * @see com.hy.enterprise.framework.persistence.domain.query.AbstractClause#addTo(java.lang.StringBuilder)
	 */
	@ Override
	StringBuilder addTo (
	                      StringBuilder stringBuilder )
	{
		stringBuilder
		             .append ( "SELECT " ) ;
		for ( int index =
		                  0 ; index < this.selectedElements.length ; index ++ )
		{
			LibraManagedObject libraManagedObject =
			                                        AliasFactory
			                                                    .about ( this.selectedElements [ index ] ) ;

			stringBuilder
			             .append ( libraManagedObject
			                                         .getPreferredStringRepresentation ( ) ) ;

			if ( index < this.selectedElements.length - 1 )
			{
				stringBuilder
				             .append ( ", " ) ;
			}
		}
		return stringBuilder ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午04:17:17</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param <T>
	 * @param type
	 * @return
	 */
	public < T > FromClause < T , S > from (
	                                         Class < T > type )
	{
		return new AbstractSchemaTypeFromClause < T , S > (
		                                                    this ,
		                                                    type ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午04:17:27</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param <T>
	 * @param collectionValued
	 * @return
	 */
	public < T > FromClause < T , S > from (
	                                         Collection < T > collectionValued )
	{
		return new CollectionValuedFromClause < T , S > (
		                                                  this ,
		                                                  collectionValued ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午04:17:11</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param <T>
	 * @param inCollection
	 * @return
	 */
	public < T > FromClause < T , S > from (
	                                         InCollection < T > inCollection )
	{
		return new InCollectionFromClause < T , S > (
		                                              this ,
		                                              inCollection ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午04:17:32</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param <T>
	 * @param singleValued
	 * @return
	 */
	public < T > FromClause < T , S > from (
	                                         T singleValued )
	{
		return new SingleValuedFromClause < T , S > (
		                                              this ,
		                                              singleValued ) ;
	}
}
